package com.yan_jiu_sheng.LeetCodeHot100.AC;

import java.util.LinkedList;
import java.util.List;

/**
 * https://leetcode.cn/problems/spiral-matrix/description/?envType=study-plan-v2&envId=top-100-liked
 * 通过
 *
 * @author yulongTian
 * @create 2024-05-29 9:47
 */
public class Test19 {
    public static void main(String[] args) {
        int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
        System.out.println(new Test19().spiralOrder(matrix));
    }

    private List<Integer> spiralOrder(int[][] matrix) {
        /*
            m=9 n=8      m=7 n=6
            第一圈         第一圈
            左   n       左
            下   m-1     下
            右   n-1     右
            上   m-2     上
         */
        List<Integer> res = new LinkedList<>();
        int m = matrix.length;
        int n = matrix[0].length;
        int tempM = m;
        int tempN = n;
        int k = 0;
        int i = 0;
        int j = 0;
        while (true) {
            // 左
            for (int p = 0; p < tempN; p++) {
                res.add(matrix[i][j++]);
                k++;
            }
            j--;
            i++;
            if (k >= m * n) {
                break;
            }

            // 下
            for (int p = 0; p < tempM - 1; p++) {
                res.add(matrix[i++][j]);
                k++;
            }
            i--;
            j--;
            if (k >= m * n) {
                break;
            }

            // 右
            for (int p = 0; p < tempN - 1; p++) {
                res.add(matrix[i][j--]);
                k++;
            }
            j++;
            i--;
            if (k >= m * n) {
                break;
            }
            // 上
            for (int p = 0; p < tempM - 2; p++) {
                res.add(matrix[i--][j]);
                k++;
            }
            i++;
            j++;
            if (k >= m * n) {
                break;
            }
            tempM -= 2;
            tempN -= 2;
        }

        return res;
    }
}
